"""
增强版Markdown解析器
支持更多markdown2 extras功能
"""
import markdown2
import logging
from typing import List, Dict, Any, Optional

logger = logging.getLogger('md2docx.parser')


class EnhancedMarkdownParser:
    """
    增强版Markdown解析器，支持丰富的markdown2 extras功能
    """
    
    # 推荐的extras配置
    RECOMMENDED_EXTRAS = [
        'tables',              # 表格支持
        'fenced-code-blocks',  # 围栏代码块
        'strike',              # 删除线
        'footnotes',           # 脚注
        'header-ids',          # 标题ID
        'toc',                 # 目录生成
        'task_list',           # 任务列表（注意下划线）
        'smarty-pants',        # 智能标点
        'metadata',            # 元数据提取
        'cuddled-lists',       # 紧密列表
        'code-friendly',       # 代码友好模式
    ]
    
    # 高级extras（可选）
    ADVANCED_EXTRAS = [
        'latex',               # LaTeX数学公式
        'admonitions',         # 警告框
        'breaks',              # 换行控制
        'target-blank-links',  # 链接新窗口打开
        'nofollow',           # nofollow链接
        'spoiler',            # 剧透标签
        'mermaid',            # Mermaid图表
    ]
    
    def __init__(self, 
                 extras: Optional[List[str]] = None,
                 link_patterns: Optional[List] = None):
        """
        初始化解析器
        
        Args:
            extras: 要启用的extras列表，默认使用推荐配置
            custom_syntax: 是否启用自定义语法扩展
            link_patterns: 自定义链接模式
        """
        self.extras = extras or self.RECOMMENDED_EXTRAS.copy()
        self.link_patterns = link_patterns
        
        logger.info(f"初始化增强版Markdown解析器，启用extras: {self.extras}")
    
    
    def add_extra(self, extra_name: str):
        """添加额外功能"""
        if extra_name not in self.extras:
            self.extras.append(extra_name)
            logger.info(f"添加extra: {extra_name}")
    
    def remove_extra(self, extra_name: str):
        """移除额外功能"""
        if extra_name in self.extras:
            self.extras.remove(extra_name)
            logger.info(f"移除extra: {extra_name}")
    
    def enable_advanced_features(self):
        """启用所有高级功能"""
        for extra in self.ADVANCED_EXTRAS:
            self.add_extra(extra)
        logger.info("启用所有高级功能")
    
    def parse(self, 
              markdown_text: str, 
              safe_mode: Optional[str] = None,
              html4tags: bool = False,
              tab_width: int = 4) -> Dict[str, Any]:
        """
        解析Markdown文本
        
        Args:
            markdown_text: Markdown文本
            safe_mode: 安全模式
            html4tags: 是否使用HTML4标签
            tab_width: Tab宽度
            
        Returns:
            包含HTML内容和元数据的字典
        """
        try:            
            # 使用markdown2进行转换
            html_result = markdown2.markdown(
                markdown_text,
                extras=self.extras,
                safe_mode=safe_mode,
                html4tags=html4tags,
                tab_width=tab_width,
                link_patterns=self.link_patterns
            )
            
            # 构建结果字典
            result = {
                'html': str(html_result),
                'extras_used': self.extras.copy()
            }
            
            # 添加额外属性（如果存在）
            if hasattr(html_result, 'toc_html'):
                result['toc_html'] = html_result.toc_html
                logger.debug("提取目录HTML")
            
            if hasattr(html_result, 'metadata'):
                result['metadata'] = html_result.metadata
                logger.debug(f"提取元数据: {html_result.metadata}")
            
            logger.info("Markdown解析完成")
            return result
            
        except Exception as e:
            logger.error(f"Markdown解析失败: {e}")
            raise
    
    def parse_file(self, 
                   file_path: str, 
                   encoding: str = 'utf-8') -> Dict[str, Any]:
        """
        解析Markdown文件
        
        Args:
            file_path: 文件路径
            encoding: 文件编码
            
        Returns:
            解析结果字典
        """
        try:
            with open(file_path, 'r', encoding=encoding) as f:
                content = f.read()
            
            logger.info(f"开始解析文件: {file_path}")
            return self.parse(content)
            
        except FileNotFoundError:
            logger.error(f"文件不存在: {file_path}")
            raise
        except UnicodeDecodeError:
            logger.error(f"文件编码错误: {file_path}")
            raise
    
    def get_supported_extras(self) -> Dict[str, str]:
        """
        获取支持的extras及其说明
        
        Returns:
            extras说明字典
        """
        return {
            'tables': '表格支持',
            'fenced-code-blocks': '围栏代码块',
            'strike': '删除线支持',
            'footnotes': '脚注支持',
            'header-ids': '自动生成标题ID',
            'toc': '自动生成目录',
            'task_list': 'GitHub风格任务列表',
            'smarty-pants': '智能标点转换',
            'metadata': '文档元数据提取',
            'cuddled-lists': '紧密列表支持',
            'code-friendly': '代码友好模式',
            'latex': 'LaTeX数学公式',
            'admonitions': 'RST风格警告框',
            'breaks': '换行控制',
            'target-blank-links': '链接新窗口打开',
            'nofollow': 'nofollow链接',
            'spoiler': '剧透标签',
            'mermaid': 'Mermaid图表',
        }
    
    def validate_config(self) -> List[str]:
        """
        验证当前配置并返回警告
        
        Returns:
            警告信息列表
        """
        warnings = []
        
        # 检查extras冲突
        if 'code-color' in self.extras and 'fenced-code-blocks' in self.extras:
            warnings.append("code-color已废弃，建议使用fenced-code-blocks")
        
        # 检查依赖
        if 'latex' in self.extras:
            try:
                import sympy
            except ImportError:
                warnings.append("latex功能需要安装sympy库")
        
        if 'mermaid' in self.extras:
            warnings.append("mermaid功能需要额外的JavaScript支持")
        
        return warnings


def md2html_enhanced(input_path: str, 
                    output_path: str,
                    extras: Optional[List[str]] = None,
                    style_config: Optional[Dict] = None) -> Dict[str, Any]:
    """
    增强版的md2html转换函数
    
    Args:
        input_path: 输入Markdown文件路径
        output_path: 输出HTML文件路径
        extras: 要启用的extras列表
        style_config: 样式配置
        
    Returns:
        转换结果信息
    """
    # 创建解析器
    parser = EnhancedMarkdownParser(extras=extras)
    
    # 验证配置
    warnings = parser.validate_config()
    if warnings:
        for warning in warnings:
            logger.warning(warning)
    
    # 解析文件
    result = parser.parse_file(input_path)
    
    # 构建HTML页面
    html_content = _build_html_page(result, style_config)
    
    # 写入文件
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write(html_content)
    
    logger.info(f"转换完成: {input_path} -> {output_path}")
    
    return {
        'input_file': input_path,
        'output_file': output_path,
        'extras_used': result['extras_used'],
        'has_toc': 'toc_html' in result,
        'has_metadata': 'metadata' in result,
        'warnings': warnings
    }


def _build_html_page(result: Dict[str, Any], 
                     style_config: Optional[Dict] = None) -> str:
    """
    构建完整的HTML页面
    
    Args:
        result: 解析结果
        style_config: 样式配置
        
    Returns:
        完整的HTML页面内容
    """
    html_parts = []
    
    # HTML头部
    html_parts.append("""<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">""")
    
    # 添加元数据
    if 'metadata' in result:
        metadata = result['metadata']
        if 'title' in metadata:
            html_parts.append(f'    <title>{metadata["title"]}</title>')
        if 'author' in metadata:
            html_parts.append(f'    <meta name="author" content="{metadata["author"]}">')
        if 'description' in metadata:
            html_parts.append(f'    <meta name="description" content="{metadata["description"]}">')
    
    # 添加样式
    if style_config:
        html_parts.append('    <style>')
        html_parts.append(_generate_css(style_config))
        html_parts.append('    </style>')
    
    html_parts.append('</head>')
    html_parts.append('<body>')
    
    # 添加目录（如果存在）
    if 'toc_html' in result:
        html_parts.append('<div class="table-of-contents">')
        html_parts.append('<h2>目录</h2>')
        html_parts.append(result['toc_html'])
        html_parts.append('</div>')
    
    # 主要内容
    html_parts.append('<div class="content">')
    html_parts.append(result['html'])
    html_parts.append('</div>')
    
    html_parts.append('</body>')
    html_parts.append('</html>')
    
    return '\n'.join(html_parts)


def _generate_css(style_config: Dict) -> str:
    """
    根据配置生成CSS样式
    
    Args:
        style_config: 样式配置
        
    Returns:
        CSS样式字符串
    """
    css_rules = []
    
    # 基础样式
    css_rules.append("""
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            line-height: 1.6;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }
        
        .table-of-contents {
            background: #f5f5f5;
            padding: 20px;
            margin-bottom: 30px;
            border-radius: 5px;
        }
        
        .table-of-contents h2 {
            margin-top: 0;
        }
        
        code {
            background: #f4f4f4;
            padding: 2px 5px;
            border-radius: 3px;
            font-family: 'Monaco', 'Consolas', monospace;
        }
        
        pre {
            background: #f4f4f4;
            padding: 15px;
            border-radius: 5px;
            overflow-x: auto;
        }
        
        blockquote {
            border-left: 4px solid #ddd;
            padding-left: 20px;
            margin: 20px 0;
            color: #666;
        }
        
        table {
            border-collapse: collapse;
            width: 100%;
            margin: 20px 0;
        }
        
        th, td {
            border: 1px solid #ddd;
            padding: 12px;
            text-align: left;
        }
        
        th {
            background: #f5f5f5;
            font-weight: bold;
        }
    """)
    
    return '\n'.join(css_rules)


if __name__ == '__main__':
    # 使用示例
    logging.basicConfig(level=logging.INFO)
    
    # 创建解析器
    parser = EnhancedMarkdownParser()
    
    # 启用高级功能
    parser.enable_advanced_features()
    
    # 显示支持的功能
    print("支持的extras:")
    for extra, desc in parser.get_supported_extras().items():
        status = "✓" if extra in parser.extras else "✗"
        print(f"  {status} {extra}: {desc}")
    
    # 转换示例
    # result = md2html_enhanced('test/example.md', 'test/example_enhanced.html')
    # print(f"转换结果: {result}") 